# 工业蒸汽量预测模型
# 导入所需的库
import pandas as pd
import numpy as np
# 导入2D绘图库
import matplotlib.pyplot as plt
# 导入数据可视化库
import seaborn as sns
# 导入科学计算库
import scipy.stats as stats
# 导入处理警告错误信息库
import warnings
# 它用于过滤掉不需要的警告信息
warnings.filterwarnings('ignore')
# 设置字体，确保支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为宋体
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 导入数据集
# 训练集：013.zhengqi_train.txt
tarin_data = pd.read_csv('file/013.zhengqi_train.txt', sep='\t')
# 测试集：013.zhengqi_test.txt   也就是通过训练数据集预测测试数据集，模型评估
test_data = pd.read_csv('file/013.zhengqi_test.txt', sep='\t')

### 打印数据集的前几行
# 其中 v0-v13 表示14个特征，target 表示目标变量也就是要预测的值
# 特征比如 包括锅炉的可调参数，如燃烧给量，一二次风，引风，返料风，给水水量；以及锅炉的工况，比如锅炉床温、床压，炉膛温度、压力，过热器的温度等
# print(tarin_data.head())

### 打印数据集的变量信息
# print(tarin_data.info())

### 生成箱式图，进行数据探索
# fig = plt.figure(figsize=(10, 5)) # 设置画布宽度高度
# sns.boxplot(tarin_data['V0'], width=0.5) # 绘制箱式图
# plt.savefig("file/013.箱式图_tarin.png", dpi=300) # 保存箱式图

### 展示所有特征的箱式图
# columns = tarin_data.columns.tolist()[:39] # 特征列表

# fig = plt.figure(figsize=(15, 25)) # 设置画布宽度高度
# for i in range(len(columns)):
#     plt.subplot(13, 3, i+1) # 13行3列，第i+1个图
#     sns.boxplot(tarin_data[columns[i]], width=0.5) # 绘制箱式图
#     plt.title(columns[i]+'标题') # 设置标题
#     plt.ylabel(columns[i]+'标签', fontsize=8, rotation=45) # 设置y轴标签

# plt.savefig("file/013.所有箱式图_tarin.png", dpi=300) # 保存箱式图

### 生成训练数据和测试数据分布折线图
# ax = sns.kdeplot(tarin_data['V0'], color="Red", shade=True) # 绘制训练数据分布图 shade：若为True，则在kde曲线下面的区域中进行阴影处理，color控制曲线及阴影的颜色
# ax = sns.kdeplot(test_data['V0'], color="Blue", shade=True) # 绘制测试数据分布图 
# # 设置X轴标签
# ax.set_xlabel('V0', fontsize=12)
# # 设置Y轴标签
# ax.set_ylabel('概率密度', fontsize=12) # 出现次数频率
# # 设置标签
# ax = ax.legend(['训练数据', '测试数据'], loc='upper right')
# # 保存图片
# plt.savefig("file/013.训练数据和测试数据分布折线图.png", dpi=300)

### 生成所有的训练数据和测试数据分布折线图
# # 生成特征列
# dist_cols = 6
# # 生成特征行
# dist_rows = len(test_data.columns) // dist_cols + 1
# plt.figure(figsize=(4*dist_cols, 4*dist_rows)) #设置画布宽度高度
# # 循环生成图
# i=1
# for col in test_data.columns:
#     # 设置子图 8行6列，第i+1个图
#     plt.subplot(dist_rows, dist_cols, i)
#     # 绘制训练数据分布图
#     ax = sns.kdeplot(tarin_data[col], color="Red", shade=True)
#     ax = sns.kdeplot(test_data[col], color="Blue", shade=True)
#     # 设置X轴标签
#     ax.set_xlabel(col, fontsize=12)
#     # 设置Y轴标签
#     ax.set_ylabel('概率密度', fontsize=12) # 出现次数频率
#     # 设置标签
#     ax = ax.legend(['训练数据', '测试数据'], loc='upper right') # loc 位置范围
#     i+=1
# # 保存图片
# plt.savefig("file/013.所有训练数据和测试数据分布折线图.png", dpi=300)

### 筛选分布特征不符合图片
# # 如下 V5,V9,V11,V17,V22,V28
# cols = 3
# rows = 2
# plt.figure(figsize=(6*cols, 6*rows)) #设置画布宽度高度
# # 循环生成图
# i=1
# for col in ['V5', 'V9', 'V11', 'V17', 'V22', 'V28']:
#     # 设置子图 2行3列，第i+1个图
#     plt.subplot(rows, cols, i)
#     # 绘制训练数据分布图
#     ax = sns.kdeplot(tarin_data[col], color="Red", shade=True)
#     ax = sns.kdeplot(test_data[col], color="Blue", shade=True)
#     # 设置X轴标签
#     ax.set_xlabel(col, fontsize=12)
#     # 设置Y轴标签
#     ax.set_ylabel('概率密度', fontsize=12) # 出现次数频率
#     # 设置标签
#     ax = ax.legend(['训练数据','测试数据'], loc='upper right') # loc 位置范围
#     i+=1
# # 保存图片
# plt.savefig("file/013.筛选分布特征不符合图片.png", dpi=300)

###  相关性，判断目标值和特征之间的关系，-1 ~ 1 直接的关系  根据自己对数据处理，有可能会误删除，要充分给出如对数直接关系可能就有关系了，

## 根据特征分布删除不符合特征  
drop_col_kde = ['V5', 'V9', 'V11', 'V17', 'V22', 'V28']
# tarin_data_drop = tarin_data.drop(drop_col_kde, axis=1) # 0为行，1为列
# # 计算数据集中每列之间的关系
# tarin_data_corr = tarin_data_drop.corr()
# # 打印查看
# # print(tarin_data_corr)
# # 绘制相关性热力图
# ax = plt.subplots(figsize=(20, 20))
# # 画热力图， annot=True显示系数（数字），square=True表示轴设置为长短相同，也就相当于每个单元格都是方形的 vmax为旁边最大值
# ax = sns.heatmap(tarin_data_corr, annot=True, vmax=0.8, square=True)
# plt.savefig("file/013.删除分布特征后相关性热力图.png", dpi=300)

# ## 绘制左下角热力图
# plt.figure(figsize=(20, 20)) #设置画布宽度高度
# # 列表头
# colnm = tarin_data_drop.columns.tolist()
# # 相关系数矩阵，任意两个变量之间的相关系数
# mcorr = tarin_data_drop.corr()
# # 构造与mcorr同维数矩阵 为bool型
# mcorr_bool = np.zeros_like(mcorr, dtype=bool)
# # 角分位线右侧设置为 true tril_indices_from为左下角 
# mcorr_bool[np.triu_indices_from(mcorr_bool)] = True
# # 设置colormap对象表示颜色
# cmap = sns.diverging_palette(220, 10, as_cmap=True)
# # 画删除分布特征后相关性右侧热力图 fmt表示保留两位小数 linewidths线的大小 
# g = sns.heatmap(mcorr, mask=mcorr_bool, cmap=cmap, square=True, annot=True, linewidths=0.5,  fmt="0.2f")
# # 保存图片
# plt.savefig("file/013.删除分布特征后相关性右侧热力图.png", dpi=300)

# 特征相关性删除筛选
# 删除训练数据和测试数据  分布不均匀，不够正态分布数据 axis表示0为行，1为列 inplace表示是否在原数据处理
tarin_data.drop(drop_col_kde, axis=1, inplace=True)
test_data.drop(drop_col_kde, axis=1, inplace=True)
# 相关系数矩阵，任意两个变量之间的相关系数
mcorr = tarin_data.corr()
# 根据相关性系数进行特征删除筛选
cond = mcorr['target'].abs() < 0.1  # 删除与目标值小于0.1的列
# 获取列名
drop_col_corr = mcorr.loc[cond].index
# drop_col_corr = ['V14', 'V21', 'V25', 'V26', 'V32', 'V33', 'V34']
# 删除筛选的数据
tarin_data.drop(drop_col_corr, axis=1, inplace=True)
test_data.drop(drop_col_corr, axis=1, inplace=True)
# 数据合并
tarin_data["label"] = "train"
test_data["label"] = "test"
all_data = pd.concat([tarin_data, test_data])
# 保存文件
all_data.to_csv("file/013.zhengiqi_all_data.csv", index=False)


